/**
 * @desc VeryCD(TM) 动态更改时间格式
 *
 * 使用了 YAHOO.util.Dom.getElementsByClassName 需要页面已加载这个 js
 * <script type="text/javascript" src="{#root_statics#}/yui-2.5.2/yahoo-dom-event/yahoo-dom-event.js"></script>
 *
 * @usage
 * 将页面中需要更改的时间用 <span class="date-time"></span> 包含
 * 页面中时间格式为: 年/月/日 时:分:秒 或 年-月-日 时:分:秒
 * 其中年为 4 位数字，其他都为 2 位数字，不足两位前面加 0 补全
 *
 * 并将该 JS 放在 body 的最后
 * <script language="javascript" type="text/javascript" src="{#root_statics#}/javascripts/time.js"></script>
 *
 * 如页面中有 ajax 等改变页面内容的行为，可再次执行 dynamicTime.updatePage(); 重新初始化
 *
 * @author ApolloPY <ApolloPY@Gmail.com>
 *
 * Copyright 2005 VeryCD Team & ApolloPY<http://www.apollopy.org/>
 * Some Rights Reserved
 */

function dynamicTime() {

    this.time        = new Array();
    this.timeDefault = new Array(); // 各个时间的初始值(因为 time 的值之后将会改变了)

    this.arraySecond = new Array(); // 需要每秒更新的值
    this.arrayMinute = new Array(); // 需要每分钟更新的值
    this.arrayHour   = new Array(); // 需要每小时更新的值

    this.isRun = new Array(); // 是否已运行

    /**
     * 持续更新页面里的时间
     */
    this.updatePage = function() {
        this.ini();

        if (!this.isRun[0] && this.arraySecond.length > 0) setInterval('dynamicTime.updateFromArray(dynamicTime.arraySecond)', 1000), this.isRun[0] = true;
        if (!this.isRun[1] && this.arrayMinute.length > 0) setInterval('dynamicTime.updateFromArray(dynamicTime.arrayMinute)', 60000), this.isRun[1] = true;
        if (!this.isRun[2] && this.arrayHour.length > 0) setInterval('dynamicTime.updateFromArray(dynamicTime.arrayHour)', 3600000), this.isRun[2] = true;
    }

    /**
     * 遍历数组，调用 formatTime 更改时间格式
     * 
     * @param Array
     */
    this.updateFromArray = function(arrayKey) {
        if (arrayKey.length) {
            for (var k=0; k < arrayKey.length; k++) {
                var _tmpFormat = this.formatTime(this.timeDefault[arrayKey[k]]);
                this.time[arrayKey[k]].innerHTML = _tmpFormat[0];
            }
        }
    }

    /**
     * 初始化
     */
    this.ini = function() {
        var mytime = YAHOO.util.Dom.getElementsByClassName('date-time');
        if (mytime.length) {
            for (var i=0; i < mytime.length; i++) {
                // 只遍历没被初始化的值
                if (mytime[i]._isset == true) continue;
                mytime[i]._isset = true;

                var k = this.timeDefault.length;
                this.time[k] = mytime[i];
                this.timeDefault[k] = mytime[i].innerHTML;

                if (this.time[k].title == '') this.time[k].title = this.timeDefault[k];

                var _tmpFormat = this.formatTime(this.timeDefault[k]);
                this.time[k].innerHTML = _tmpFormat[0];

                if (1 == _tmpFormat[1]) this.arraySecond.push(k);
                if (2 == _tmpFormat[1]) this.arrayMinute.push(k);
                if (3 == _tmpFormat[1]) this.arrayHour.push(k);
            }
        }
    }

    /**
     * 格式化时间
     * @desc level 只做刷新间隔的建议，不参与实际刷新逻辑的记录
     * =0 不需刷新 =1 秒级别刷新 =2 分钟级别刷新 =3 小时级别刷新
     *
     * @param String
     * @return Array(timeSting, level)
     */
    this.formatTime = function(timeSting) {
        var SecMilli = 1000;// 秒
        var MinMilli = SecMilli * 60;// 分
        var HrMilli  = MinMilli * 60;// 小时
        var DyMilli  = HrMilli * 24;// 天

        // 输入的时间
        var toMsTime = this.getMsTime(timeSting);
        if (toMsTime == false) return new Array(timeSting, 0);
        var toTime = new Date(toMsTime);

        // 当前时间
        var now = new Date();
        var localMsTime = now.getTime();

        // 时间差
        var offset = localMsTime - toMsTime;

        // 格式
        var forTime;
        if ( Math.floor(offset / SecMilli) < 0 ) {
            if ( Math.floor(offset / MinMilli) < -15 ) {
                now.setHours(0, 0, 0, 0);
                toTime.setHours(0, 0, 0, 0);
                offset      = now.getTime() - toTime.getTime();
                offsetDy    = Math.floor(offset / DyMilli);

                toYear      = toTime.getFullYear();
                toMonth     = toTime.getMonth() + 1;
                toDay       = toTime.getDate();
                forTime = toYear + "/" + toMonth + "/" + toDay;
                return new Array(forTime, 3);
            } else {
                forTime = "刚才";
                return new Array(forTime, 1);
            }
        } else if ( Math.floor(offset / SecMilli) < 60 ) {
            forTime = Math.floor(offset / SecMilli) + "秒前";
            return new Array(forTime, 1);
        } else if ( Math.floor(offset / MinMilli) < 60 ) {
            forTime = Math.floor(offset / MinMilli) + "分钟前";
            return new Array(forTime, 2);
        } else if ( Math.floor(offset / HrMilli) < 24 ) {
            forTime = Math.floor(offset / HrMilli) + "小时前";
            return new Array(forTime, 3);
        } else {
            /////////////////////////////////////////////////
            now.setHours(0, 0, 0, 0);
            toTime.setHours(0, 0, 0, 0);
            offset      = now.getTime() - toTime.getTime();
            offsetDy    = Math.floor(offset / DyMilli);

            toYear      = toTime.getFullYear();
            toMonth     = toTime.getMonth() + 1;
            toDay       = toTime.getDate();

            if ( offsetDy == 1 ) {
                forTime = "昨天 ";
            } else if ( offsetDy == 2 ) {
                forTime = "前天 ";
            } else if (now.getFullYear() == toYear) {
                forTime = toMonth + "月" + toDay + "日";
            } else {
                forTime = toYear + "/" + toMonth + "/" + toDay;
            }
            return new Array(forTime, 0);
        }
    }

    /**
     * 将 年/月/日 时:分:秒 或 年-月-日 时:分:秒 格式的时间转换成毫秒
     * 返回的时间 时区是客户端的时区 默认服务器端的时区是+8
     *
     * @param String
     * @return ms
     */
    this.getMsTime = function(timeString) {
        var re, r, msTime, offset;

        re = /(\d{4})[\/-](\d{2})[\/-](\d{2})\s(\d{2})\:(\d{2})\:(\d{2})/;
        r  = timeString.match(re);
        if (r == null) return false;

        msTime = Date.parse(r[2]+"/"+r[3]+"/"+r[1]+" "+r[4]+":"+r[5]+":"+r[6]);
        offset  = this.getTCOffset();
        msTime += offset;

        return(msTime);
    }

    /**
     * 取当前客户端时区和服务器时区之差
     *
     * @return ms
     */
    this.getTCOffset = function() {
        var d, localTZ, offset;
        var serverTZ = -480;// 服务器时区偏移值 分钟

        d = new Date();
        localTZ = d.getTimezoneOffset();// 客户机本地时区偏移值 分钟
        offset  = (serverTZ-localTZ)*60*1000;

        return(offset);
    }
}

var dynamicTime = new dynamicTime();
dynamicTime.updatePage();